import java.util.Scanner;

public class LoadingTest {
    /**
     * 只有一艘船进行回溯的集装箱装入
     *
     */
    private static int[] x; // 当前解，0代表不放，1代表放
    private static int[] bestx; // 最优解
    private static int[] w; // 集装箱i的重量
    private static int bestw; // 当前最优装载重量
    private static int r; // 剩余集装箱的重量
    private static int n; // 集装箱的数量
    private static int c1; // 轮船1的载重量
    private static int cw; // 当前轮船1的载重量

    public static void main(String[] args) {
        input();
        initialize();
        backtrack(0);
        output();
    }

    private static void input() {
        Scanner input = new Scanner(System.in);
        System.out.println("请输入集装箱的数量：");
        n = input.nextInt();
        System.out.println("请输入轮船的载重量：");
        c1 = input.nextInt();
        System.out.println("请输入每个集装箱的重量：");
        w = new int[n];
        for (int i = 0; i < n; i++) {
            w[i] = input.nextInt();
        }
        input.close();
    }

    private static void initialize() {
        r = 0;
        cw = 0;
        bestw = 0;
        for (int i = 0; i < n; i++) {
            r += w[i];
        }
        x = new int[n];
        bestx = new int[n];
    }

    // 回溯法
    private static void backtrack(int i) {
        if (i == n) { // 判断是否达到叶子节点
            if (cw > bestw) {
                System.arraycopy(x, 0, bestx, 0, n);
                bestw = cw;
            }
        } else {
            r -= w[i];
            if (cw + w[i] <= c1) { // 判断该集装箱到底放不放
                x[i] = 1;
                cw += w[i];
                backtrack(i + 1);

                // 当节点i的子树延伸结束时要返回i节点
                x[i] = 0;
                cw -= w[i];

                // 进行回溯的判断
            }
            // 进行剪枝
            if (cw + r > bestw) { // 判断先不放该集装箱后是否还有可行解
                //这个条件表示存在一种可能性，即使当前集装箱 x[i] 不放入轮船，后续的集装箱仍然可以使得总装载重量超过当前最优解。
                //如果本身就不满足的话，后续
                x[i] = 0;
                backtrack(i + 1);
            }
            r += w[i]; // 当节点i的子树延伸结束时要返回i节点
        }
    }

    private static void output() {
        if (bestw > c1) {
            System.out.println("装不下啊！");
        } else {
            System.out.print("装入的集装箱为：");
            for (int i = 0; i < n; i++) {
                if (bestx[i] == 1) {
                    System.out.print(i + " ");
                }
            }
        }
    }

}
